#include "consoleappender.h"
#include <QColor>

ConsoleAppender::ConsoleAppender()
    : BaseAppender()
{
    initDefaultColors();
}

ConsoleAppender::ConsoleAppender(LogLevel level)
    : BaseAppender(level)
{
    initDefaultColors();
}

void ConsoleAppender::setLevelColor(LogLevel level, const QColor &color)
{
    QMutexLocker locker(&m_mutex);
    // 转换为ANSI代码并更新映射
    m_levelAnsiCodes[level] = colorToAnsiCode(color);
}

void ConsoleAppender::append(LogLevel level, const QString &msg)
{
    QMutexLocker locker(&m_mutex);  // 线程安全：避免多线程颜色错乱

    // 1. 级别过滤
    if (level < m_level) return;

    // 2. 获取当前级别的ANSI颜色代码（默认黑色）
    QString ansiCode = m_levelAnsiCodes.value(level, "\033[30m");

    // 3. 拼接带颜色的日志（颜色代码 + 日志内容 + 重置代码）
    QString coloredMsg = ansiCode + msg + ANSI_RESET;

    // 4. 输出到终端（stdout）
    fprintf(stdout, "%s\n", coloredMsg.toUtf8().data());
    fflush(stdout);  // 强制刷新，确保即时显示
}

void ConsoleAppender::setLevel(LogLevel level)
{
    QMutexLocker locker(&m_mutex);
    BaseAppender::setLevel(level);  // 调用基类方法修改日志级别
}

void ConsoleAppender::initDefaultColors()
{
    // 与QTextEditAppender默认颜色对应，转换为ANSI代码
    m_levelAnsiCodes[LogLevel::Debug] = colorToAnsiCode(QColor(0x00,0xA0,0x00));    // 绿色
    m_levelAnsiCodes[LogLevel::Info] = colorToAnsiCode(QColor(0x00,0x66,0xCC));     // 蓝色
    m_levelAnsiCodes[LogLevel::Warning] = colorToAnsiCode(QColor(0xFF,0xD7,0x00));  // 黄色
    m_levelAnsiCodes[LogLevel::Error] = colorToAnsiCode(QColor(0xFF,0x33,0x33));    // 红色
    m_levelAnsiCodes[LogLevel::Fatal] = colorToAnsiCode(QColor(0x99,0x00,0xCC));    // 紫色
}

QString ConsoleAppender::colorToAnsiCode(const QColor &color) const
{
    return QString("\033[38;2;%1;%2;%3m")
    .arg(color.red())
        .arg(color.green())
        .arg(color.blue());
}
